import type { RouteRecordRaw, RouteMeta } from "vue-router"
import { RoleEnum } from "/@/enums/roleEnum"
import { defineComponent } from "vue"

export type Component<T extends any = any> = ReturnType<typeof defineComponent> | (() => Promise<typeof import("*.vue")>) | (() => Promise<T>)

// @ts-ignore
export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, "meta"> {
  name: string
  id: string
  parentId: string
  meta: RouteMeta
  component?: Component | string
  components?: Component
  children?: AppRouteRecordRaw[]
  props?: Recordable
  fullPath?: string
  alwaysShow?: boolean
}

export interface MenuTag {
  type?: "primary" | "error" | "warn" | "success"
  content?: string
  dot?: boolean
}

export interface Menu {
  name: string

  // 菜单标识, 用于一些业务场景处理
  code?: string

  icon?: string

  path: string

  // path contains param, auto assignment.
  paramPath?: string

  disabled?: boolean

  children?: Menu[]

  orderNo?: number

  roles?: RoleEnum[]

  meta?: Partial<RouteMeta>

  tag?: MenuTag

  hideMenu?: boolean

  alwaysShow?: boolean

  id: string

  isMainOut: boolean

  external?: boolean
}

export interface MenuModule {
  orderNo?: number
  menu: Menu
}

// export type AppRouteModule = RouteModule | AppRouteRecordRaw;
export type AppRouteModule = AppRouteRecordRaw
